<?php

/**
 * login actions.
 *
 * @package    asi2vSymfony
 * @subpackage login
 * @author     McCubo
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class loginActions extends sfActions {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeIndex() {
        
    }

    public function executeSaveNewUser(sfWebRequest $oWebRequest) {
        $aData = array('message_list' => array());
        $all = $oWebRequest->getParameterHolder()->getAll();
        $oUsuarioMail = Doctrine_Core::getTable("Usuario")->findOneByEmail($oWebRequest->getParameter("email"));
        if (NULL != $oUsuarioMail) {
            array_push($aData['message_list'], "Correo ingresado ya existe, elija otro por favor");
        }
        $oUserUsername = Doctrine_Core::getTable("Usuario")->findOneByUsername($oWebRequest->getParameter("username"));
        if (NULL != $oUserUsername) {
            array_push($aData['message_list'], "Usuario ingresado ya existe, elija otro por favor");
        } elseif ($oWebRequest->getParameter("password") != $oWebRequest->getParameter("confirm_password")) {
            array_push($aData['message_list'], "Las password no coinciden, intente otra vez");
        } else {
            $oUsuarioRecord = new Usuario();
            $oUsuarioRecord->setUsername($oWebRequest->getParameter("username"));
            $oUsuarioRecord->setEmail($oWebRequest->getParameter("email"));
            $oUsuarioRecord->setPassword(md5(sha1($oWebRequest->getParameter("password"))));
            $oUsuarioRecord->setNombre($oWebRequest->getParameter("firstname"));
            $oUsuarioRecord->setApellido($oWebRequest->getParameter("lastname"));
            $oUsuarioRecord->setGenero($oWebRequest->getParameter("gender"));
            $oUsuarioRecord->setIdRol(5);
            $oUsuarioRecord->setStatus(1);
            $oUsuarioRecord->save();
            $oPaciente = new Paciente();
            $oPaciente->setTipoSanguineo($oWebRequest->getParameter("bloodtype"));
            $oPaciente->setFechaNacimiento($oWebRequest->getParameter("birthdate"));
            $oPaciente->setUsuario($oUsuarioRecord);
            $oPaciente->save();
        }
        $this->getResponse()->setContent(json_encode($aData));
        return sfView::NONE;
    }

    public function executeDoLogin(sfWebRequest $oRequest) {
        $aData = array('message_list' => array());
        $sUsername = $oRequest->getParameter('username');
        $sPassword = md5(sha1($oRequest->getParameter('passwd')));
        $oUser = Doctrine_Core::getTable('Usuario')->findOneByUsernameAndPasswordAndStatus($sUsername, $sPassword, 1);
        if (NULL != $oUser) {
            $this->getUser()->getAttributeHolder()->clear();
            $this->getUser()->clearCredentials();
            if (!$this->getUser()->isAuthenticated()) {
                $this->getUser()->setAuthenticated(true);
            }
            if ($oUser->getRol()->isRolActive()) {
                $this->getUser()->addCredential($oUser->getRol()->getNombre());
            }
            $this->getUser()->setAttribute('full_name', $oUser->getFullName());
            $this->getUser()->setAttribute('username', $oUser->getUsername());
            $this->getUser()->setAttribute('user_id', $oUser->getIdUsuario());
            $oUser->setUltimoIngreso(date("Y-m-d H:i:s"));
            #$oUser->save();
        } else {
            array_push($aData['message_list'], "Acceso denegado!, compruebe sus credenciales.");
        }
        $this->getResponse()->setContent(json_encode($aData));
        return sfView::NONE;
    }

    public function executeDoLogout() {
        $this->getUser()->getAttributeHolder()->clear();
        $this->getUser()->clearCredentials();
        $this->getUser()->setAuthenticated(false);
        $this->redirect('login/index');
    }

    public function executeDoUpdatePassword(sfWebRequest $oWebRequest) {
        $aData = array('message_list' => array());
        $sUserId = $oWebRequest->getParameter("user_id");
        $sNewPassword = $oWebRequest->getParameter("new_passwd");
        $bUpdated = Doctrine_Core::getTable("Usuario")->updatePassword($sUserId, $sNewPassword);
        if (!$bUpdated) {
            array_push($aData['message_list'], "Un error no esperado ha ocurrido, favor intentar otra vez!");
        } else {
            $oCollection = Doctrine_Core::getTable("PasswordRecovery")->findByIdUsuario($sUserId);
            foreach ($oCollection as $oRecord) {
                $oRecord->setStatus(0);
                $oRecord->save();
            }
        }
        $this->getResponse()->setContent(json_encode($aData));
        return sfView::NONE;
    }

    public function executeRecover(sfWebRequest $oWebRequest) {
        $sToken = $oWebRequest->getParameter("token");
        $this->oPassword = Doctrine_Core::getTable("PasswordRecovery")->findOneByToken($sToken);
        if (NULL == $this->oPassword) {
            $this->forward404();
        }
        if ($this->oPassword->getStatus() == 0) {
            $this->redirect('login/token');
        }
    }

    public function executeToken() {
        
    }

    public function executeForgotPassword(sfWebRequest $oWebRequest) {
        $aData = array('message_list' => array());
        $sEmail = $oWebRequest->getParameter("email");
        $oUsuario = Doctrine_Core::getTable("Usuario")->findOneByEmail($sEmail);
        if ($oUsuario == NULL) {
            array_push($aData['message_list'], "No existe usuario con el Correo especificado!");
        } else {
            try {
                $Date = date("Y-m-d");
                $sDateHash = date("Y-m-d H:i:s");
                $sDueDate = date('Y-m-d', strtotime($Date . ' + 5 days'));
                $sHash = md5($sDateHash . $oUsuario->getIdUsuario());
                $sUrl = $this->generateUrl('recover_password', array('token' => $sHash));
                $sUrl = "http://ufg-group.info" . $sUrl;
                //$sUrl = "http://localhost" . $sUrl;
                $oPasswordRecord = new PasswordRecovery();
                $oPasswordRecord->setUsuario($oUsuario);
                $oPasswordRecord->setDueDate($sDueDate);
                $oPasswordRecord->setLinkRecovery($sUrl);
                $oPasswordRecord->setToken($sHash);
                $oPasswordRecord->save();

                $sBody = $this->getPartial("email_template", array("sUrl" => $sUrl,
                    "sDueDate" => $sDueDate,
                    "oUsuario" => $oUsuario)
                );
                $oMessageCompose = $this->getMailer()->compose();
                $oMessageCompose->setSubject("Recuperar Clave de acceso");
                $oMessageCompose->setTo($oUsuario->getEmail());
                $oMessageCompose->setFrom("nazareth@example.com", "Nazareth Bot");
                $oMessageCompose->setBody($sBody, 'text/html');
                $this->getMailer()->send($oMessageCompose);
            } catch (Exception $exc) {
                array_push($aData['message_list'], $exc->getCode() . " :: " . $exc->getMessage());
            }

            $aData['success'] = $oUsuario->getFullName() . " en un momento recibiras un Correo con tu nueva password temporal!";
        }
        $this->getResponse()->setContent(json_encode($aData));
        return sfView::NONE;
    }

}